/**
 * 支付工具类
 * 处理微信小程序支付相关的功能
 */

import config from './config';

class PaymentUtil {
  /**
   * 创建订单并获取支付参数
   * @param {Object} orderData 订单数据
   * @param {string} token 用户token
   * @returns {Promise} 返回支付参数
   */
  static async createOrder(orderData, token) {
    return new Promise((resolve, reject) => {
      wx.request({
        url: `${config.baseUrl}/seal/createAppletOrder`,
        method: 'POST',
        header: {
          'Authorization': token,
          'content-type': 'application/json'
        },
        data: { ...orderData },
        success: (res) => {
          // 统一返回完整的响应对象，让调用方自己处理
          resolve(res.data);
        },
        fail: (err) => {
          reject(new Error('网络错误，请重试'));
        }
      });
    });
  }

  /**
   * 调用微信支付
   * @param {Object} paymentParams 支付参数
   * @returns {Promise} 支付结果
   */
  static async requestPayment(paymentParams) {
    return new Promise((resolve, reject) => {
      wx.requestPayment({
        timeStamp: paymentParams.timeStamp,
        nonceStr: paymentParams.nonceStr,
        package: paymentParams.package,
        signType: paymentParams.signType,
        paySign: paymentParams.paySign,
        success: (res) => {
          resolve(res);
        },
        fail: (err) => {
          reject(err);
        }
      });
    });
  }

  /**
   * 验证支付参数
   * @param {Object} paymentParams 支付参数
   * @returns {boolean} 验证结果
   */
  static validatePaymentParams(paymentParams) {
    const requiredFields = ['timeStamp', 'nonceStr', 'package', 'signType', 'paySign'];
    
    for (const field of requiredFields) {
      if (!paymentParams[field]) {
        console.error(`支付参数缺失: ${field}`);
        return false;
      }
    }
    
    return true;
  }

  /**
   * 查询订单支付状态
   * @param {string} orderId 订单ID
   * @param {string} token 用户token
   * @returns {Promise} 订单状态
   */
  static async queryOrderStatus(orderId, token) {
    return new Promise((resolve, reject) => {
      wx.request({
        url: `${config.baseUrl}/seal/queryOrderStatus`,
        method: 'GET',
        header: {
          'Authorization': token
        },
        data: {
          orderId: orderId
        },
        success: (res) => {
          if (res.data && res.data.code === 200) {
            resolve(res.data.data);
          } else {
            reject(new Error(res.data.message || '查询订单状态失败'));
          }
        },
        fail: (err) => {
          reject(new Error('网络错误，请重试'));
        }
      });
    });
  }

  /**
   * 处理支付错误
   * @param {Object} err 错误信息
   * @returns {string} 错误提示信息
   */
  static getPaymentErrorMessage(err) {
    if (!err || !err.errMsg) {
      return '支付失败，请重试';
    }

    const errMsg = err.errMsg.toLowerCase();
    
    if (errMsg.includes('cancel')) {
      return '支付已取消';
    } else if (errMsg.includes('fail')) {
      return '支付失败，请重试';
    } else if (errMsg.includes('timeout')) {
      return '支付超时，请重试';
    } else if (errMsg.includes('network')) {
      return '网络错误，请检查网络连接';
    } else {
      return '支付失败，请重试';
    }
  }

  /**
   * 显示支付结果
   * @param {boolean} isSuccess 是否支付成功
   * @param {string} message 提示信息
   * @param {Function} callback 回调函数
   */
  static showPaymentResult(isSuccess, message, callback) {
    if (isSuccess) {
      wx.showToast({
        title: message || '支付成功',
        icon: 'success',
        duration: 2000
      });
      
      setTimeout(() => {
        if (callback) callback();
      }, 2000);
    } else {
      wx.showModal({
        title: '支付结果',
        content: message || '支付失败',
        showCancel: false,
        confirmText: '确定',
        success: () => {
          if (callback) callback();
        }
      });
    }
  }
}

module.exports = PaymentUtil; 